/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：太平金科-基础组件封装层-SpringCloud组件封装-核心依赖
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taipingframework.cloud.web.openfeign;

import feign.Logger;
import feign.Retryer;
import org.springframework.context.annotation.Bean;

import java.util.concurrent.TimeUnit;

/**
 * Spring Cloud OpenFeign 官方文档
 * https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#spring-cloud-feign-overriding-defaults
 * <p>
 * # 1.2. Overriding Feign Defaults
 * <p>
 * 更多详细配置，请参考源码：{@link org.springframework.cloud.openfeign.FeignClientsConfiguration}
 */
public class DefaultOpenFeignConfig {
//CHECKSTYLE:OFF

    /**
     * 设置 日志级别
     */
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

    /**
     * 设置 重试机制：重试间隔为100ms，最大重试时间为1秒，最大重试次数为5次。
     */
    @Bean
    public Retryer feignRetryer() {
        return new Retryer.Default(100, TimeUnit.SECONDS.toMillis(1), 5);
    }

    /////////////////////////////////// 下面注释掉的代码仅供参考，未完全通过测试，毕竟bug难改，万万不可投入使用 ///////////////////////////////////

    /*
     * 设置 Decoder解码器，负责将JSON字符串转换成JavaBean对象。
     *
    @Bean
    public Decoder decoder() {
        return new ResponseEntityDecoder(new SpringDecoder(feignHttpMessageConverter()));
    }

    /*
     * 设置 Encoder编码器，负责将Java对象转换为JSON字符串。
     *
    @Bean
    public Encoder encoder() {
        return new SpringEncoder(feignHttpMessageConverter());
    }

    /*
     * 自定义 报文消息转换器
     *
    private ObjectFactory<HttpMessageConverters> feignHttpMessageConverter() {
        List<MediaType> mediaTypes = new ArrayList<>();
        mediaTypes.add(MediaType.valueOf(MediaType.APPLICATION_JSON_VALUE + ";charset=UTF-8"));
        mediaTypes.add(MediaType.valueOf(MediaType.APPLICATION_XML_VALUE + ";charset=UTF-8"));
        mediaTypes.add(MediaType.valueOf(MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8"));

        // 使用自定义的ObjectMapper，其实，通过翻看源码就可以知道，这个消息转换器大可不必配置，我们只需将该自定义的ObjectMapper注入Spring容器，即可实现与此处相同的效果。
        // 此处，需要注意，ObjectMapper请支持Java8日期和时间类型，也就是LocalDate和LocalDateTime，否则在返回时将会导致异常。
        final MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(JacksonHelper.getObjectMapper());
        mappingJackson2HttpMessageConverter.setSupportedMediaTypes(mediaTypes);
        final HttpMessageConverters httpMessageConverters = new HttpMessageConverters(mappingJackson2HttpMessageConverter);

        return () -> httpMessageConverters;
    }*/

//CHECKSTYLE:ON
}
